home *** CD-ROM | disk | FTP | other *** search
/ F1 Licenseware / F1 Licenseware - Volume 1.iso / disks / 079c.dms / 079c.adf / how2writeagame.lha / how2write_a_game / mapper.AMOS / mapper.amosSourceCode < prev    next >
Encoding:
AMOS Source Code  |  1992-03-06  |  25.8 KB  |  955 lines

  1. ' ************************************************************** 
  2. '
  3. '                           =============
  4. '
  5. '                           PACMAN MAPPER
  6. '
  7. '                           =============
  8. '
  9. '         - As Seen On TV! (the one you're looking at now) - 
  10. '
  11. '                         /\/\/\/\/\/\/\/\/\ 
  12. '                         By: Paul Nordovics 
  13. '                         \/\/\/\/\/\/\/\/\/ 
  14. '  
  15. ' Notes: 
  16. ' ====== 
  17. '
  18. ' This Mapper Can Be Used/Modified For Your Own Games But Please 
  19. ' Don't Pass It Off As Your Own Work!
  20. '
  21. ' ************************************************************** 
  22. '
  23. ' ******************************************************************   
  24. ' Set Up Mapper Display:   
  25. ' The Mapper Panel Is Stored In Bank 2 Which Is Unpacked To Screen 0 
  26. ' ******************************************************************   
  27. Unpack 2 To 0
  28. Screen Display 0,128,45,320,256
  29. '
  30. ' *******************  
  31. ' Set Up Mapper Panel  
  32. ' *******************  
  33. MAZE_NUMBER=0
  34. Gosub _SHOW_MAZE_NUMBER
  35. '
  36. BLOCK_NUMBER=1
  37. Gosub _SHOW_BLOCK
  38. '
  39. ' *********************************  
  40. ' Set Up Zones For Buttons On Panel
  41. ' *********************************  
  42. Reserve Zone 14
  43. Set Zone 1,15,237 To 30,252 : Rem Prev Maze
  44. Set Zone 2,33,237 To 48,252 : Rem Next Maze
  45. Set Zone 3,64,224 To 111,239 : Rem Load 
  46. Set Zone 4,64,240 To 111,255 : Rem Save 
  47. Set Zone 5,112,224 To 143,239 : Rem Copy 
  48. Set Zone 6,112,240 To 143,255 : Rem Paste
  49. Set Zone 7,144,224 To 191,239 : Rem Undo Last
  50. Set Zone 8,144,240 To 191,255 : Rem Undo All 
  51. Set Zone 9,243,230 To 252,239 : Rem Next Block 
  52. Set Zone 10,243,240 To 252,249 : Rem Prev Block 
  53. Set Zone 11,256,224 To 287,239 : Rem Clear
  54. Set Zone 12,256,240 To 287,255 : Rem Grid 
  55. Set Zone 13,288,224 To 319,239 : Rem Spare Button 
  56. Set Zone 14,288,240 To 319,255 : Rem Bye! 
  57. '
  58. ' ****************************************   
  59. ' Make Space For Map,Undo And Copy Buffers   
  60. ' **************************************** 
  61. Reserve As Work 10,(260*100)+(260*3)+(260)
  62. '
  63. MAPPER_BASE=Start(10)
  64. UNDO_BASE=Start(10)+(260*100)
  65. UNDO_POINTER=0
  66. _COPY_BASE=UNDO_BASE+(260*3)
  67. '
  68. ' *************************************************************
  69. '
  70. ' If You Use This Mapper For Other Games, Change These Values: 
  71. ' LAST MAZE = The Number Of Mazes You Have Created-1 
  72. ' i.e. If You Have 100 Mazes, Set This Value To 99 
  73. '
  74. ' LAST BLOCK = The Number Of Map Blocks You Have 
  75. '
  76. ' *************************************************************
  77. LAST_MAZE=19
  78. LAST_BLOCK=42
  79. '
  80. _WAIT_DELAY=5
  81. '
  82. ' ******************************************** 
  83. ' Position Mouse Pointer At Top-Left Of Screen 
  84. ' And Prevent It From Going Off-Screen 
  85. ' ******************************************** 
  86. X Mouse=128 : Y Mouse=45
  87. Limit Mouse 128,45 To 128+319,45+255
  88. '
  89. ' -------------------------------------------------------------
  90. '
  91. ' *************************************************************
  92. '                             MAIN LOOP
  93. ' *************************************************************
  94. Do 
  95.    Wait Vbl 
  96.    ' ************************************ 
  97.    ' Get Mouse Co-ords Once Only Per Loop 
  98.    ' ************************************ 
  99.    MOUSE_X=X Screen(X Mouse)/16 : MOUSE_Y=Y Screen(Y Mouse)/16
  100.    '
  101.    ' *********************************************************
  102.    ' Test For Functions Accessed By Pressing Left Mouse Button
  103.    ' *********************************************************
  104.    If Mouse Key=1
  105.       ' *********************************************
  106.       ' Flag So We Know Left Mouse Button Was Pressed
  107.       ' *********************************************
  108.       LMB=1
  109.       ' *********************************
  110.       ' Are We Pointing At Maze Work Area
  111.       ' *********************************
  112.       If MOUSE_Y<13
  113.          ' *******************************  
  114.          ' Is Space Bar Being Pressed Also
  115.          ' *******************************  
  116.          If Key State($40)
  117.             ' ************************************** 
  118.             ' Yes - So Delete Block At Mouse Pointer 
  119.             ' ************************************** 
  120.             Gosub DELETE_BLOCK
  121.          Else 
  122.             ' ************************************ 
  123.             ' No - So Place Block At Mouse Pointer 
  124.             ' ************************************ 
  125.             Gosub PLACE_BLOCK
  126.          End If 
  127.       Else 
  128.          ' *******************************************  
  129.          ' See If We Want To Use A Function From Panel  
  130.          ' *******************************************  
  131.          Gosub CHANGE_MAZE_NUMBER
  132.          Gosub _LOAD
  133.          Gosub _SAVE
  134.          Gosub _COPY
  135.          Gosub PASTE
  136.          Gosub UNDO_LAST
  137.          Gosub UNDO_ALL
  138.          Gosub CHANGE_BLOCK
  139.          Gosub CLEAR
  140.          Gosub _TOGGLE_GRID
  141.          Gosub BYE
  142.       End If 
  143.    End If 
  144.    ' ********************************************************** 
  145.    ' Test For Functions Accessed By Pressing Right Mouse Button 
  146.    ' ********************************************************** 
  147.    If Mouse Key=2
  148.       ' *************************************
  149.       ' Are We Pointing To The Maze Work Area
  150.       ' *************************************
  151.       If MOUSE_Y<13
  152.          ' ***************************************************************
  153.          ' Yes - So Change The Current Block To The One We Are Pointing At
  154.          ' ***************************************************************
  155.          MAZE_POINTER=Start(10)+(MAZE_NUMBER*260)+(MOUSE_Y*20)+MOUSE_X
  156.          If Peek(MAZE_POINTER)<>BLOCK_NUMBER and Peek(MAZE_POINTER)>0
  157.             BLOCK_NUMBER=Peek(MAZE_POINTER)
  158.             Gosub _SHOW_BLOCK
  159.          End If 
  160.       End If 
  161.    End If 
  162. Loop 
  163. '
  164. ' -------------------------------------------------------------
  165. '
  166. ' *************************************************************
  167. '
  168. '                             =======
  169. '                             GOSUB'S
  170. '                             =======
  171. '
  172. '  Shoved At The End Of The Program So They Are Out Of The Way   
  173. '                        
  174. ' *************************************************************
  175. '
  176. ' -------------------------------------------------------------
  177. '
  178. ' *************************************************************  
  179. '                         SHOW MAZE NUMBER 
  180. '
  181. ' Displays The Current Maze Number On The Functions Panel  
  182. ' *************************************************************  
  183. _SHOW_MAZE_NUMBER:
  184. ' ******************** 
  185. ' Blank Out Last Value 
  186. ' ******************** 
  187. Cls 2,37,227 To 45,236
  188. '
  189. ' ***********************  
  190. ' Show 10's Part Of Value
  191. ' ***********************  
  192. X1=MAZE_NUMBER/10
  193. Screen Copy 0,(X1*4),256,(X1*4)+4,263 To 0,37,227
  194. '
  195. ' ************************ 
  196. ' Show Units Part Of Value 
  197. ' ************************ 
  198. X0=MAZE_NUMBER-(X1*10)
  199. Screen Copy 0,(X0*4),256,(X0*4)+4,263 To 0,41,227
  200. Return 
  201. '  
  202. ' -------------------------------------------------------------
  203. '
  204. ' *************************************************************  
  205. '                           SHOW BLOCK 
  206. '
  207. ' Displays The Current, Chosen Block On The Functions Panel
  208. ' *************************************************************  
  209. _SHOW_BLOCK:
  210. ' ******************** 
  211. ' Blank Out Last Block 
  212. ' ******************** 
  213. Cls 0,221,231 To 222+17,232+17
  214. '
  215. ' ****************** 
  216. ' Show Current Block 
  217. ' ****************** 
  218. Paste Bob 222,232,BLOCK_NUMBER
  219. Return 
  220. '
  221. ' -------------------------------------------------------------
  222. '
  223. ' *************************************************************  
  224. '                        CHANGE MAZE NUMBER  
  225. '
  226. ' Move To Either The Previous Or The Next Maze 
  227. ' *************************************************************  
  228. CHANGE_MAZE_NUMBER:
  229. ' *******************  
  230. ' Go To Previous Maze
  231. ' *******************  
  232. If Mouse Zone=1 and MAZE_NUMBER>0 and LMB=1
  233.    ' **************** 
  234.    ' Highlight Button 
  235.    ' **************** 
  236.    X0=15 : Y0=237 : X1=30 : Y1=252
  237.    Gosub HIGHLIGHT_BUTTON
  238.    '
  239.    ' ****************************** 
  240.    ' Onto Previous Maze And Show It 
  241.    ' ****************************** 
  242.    Add MAZE_NUMBER,-1
  243.    Gosub _SHOW_MAZE_NUMBER
  244.    Gosub _SHOW_MAZE
  245.    '
  246.    UNDO_POINTER=0
  247.    LMB=0
  248.    '
  249.    Wait _WAIT_DELAY
  250.    '
  251.    ' ********************** 
  252.    ' And Unhighlight Button 
  253.    ' ********************** 
  254.    X0=15 : Y0=237 : X1=30 : Y1=252
  255.    Gosub UNHIGHLIGHT_BUTTON
  256. End If 
  257. '
  258. ' ***************  
  259. ' Go To Next Maze
  260. ' ***************  
  261. If Mouse Zone=2 and MAZE_NUMBER<LAST_MAZE and LMB=1
  262.    ' **************** 
  263.    ' Highlight Button 
  264.    ' **************** 
  265.    X0=33 : Y0=237 : X1=48 : Y1=252
  266.    Gosub HIGHLIGHT_BUTTON
  267.    '
  268.    ' ************************** 
  269.    ' Onto Next Maze And Show It 
  270.    ' ************************** 
  271.    Add MAZE_NUMBER,1
  272.    Gosub _SHOW_MAZE_NUMBER
  273.    Gosub _SHOW_MAZE
  274.    '
  275.    UNDO_POINTER=0
  276.    LMB=0
  277.    '
  278.    Wait _WAIT_DELAY
  279.    '
  280.    ' ****************** 
  281.    ' Unhighlight Button 
  282.    ' ****************** 
  283.    X0=33 : Y0=237 : X1=48 : Y1=252
  284.    Gosub UNHIGHLIGHT_BUTTON
  285. End If 
  286. Return 
  287. '
  288. ' -------------------------------------------------------------
  289. ' *************************************************************  
  290. '                       HIGHLIGHT BUTTON 
  291. '
  292. ' Draws A White Box Around A Button To Show It Has Been
  293. ' Selected 
  294. ' *************************************************************  
  295. HIGHLIGHT_BUTTON:
  296. Ink 1
  297. Box X0,Y0 To X1,Y1
  298. Return 
  299. '
  300. ' -------------------------------------------------------------
  301. '
  302. ' *************************************************************  
  303. '                       UNHIGHLIGHT BUTTON 
  304. '
  305. ' Draws A Black Box Around The Selected Button To Indicate That  
  306. ' The Function Has Been Completed
  307. ' *************************************************************  
  308. UNHIGHLIGHT_BUTTON:
  309. Ink 0
  310. Box X0,Y0 To X1,Y1
  311. Return 
  312. '  
  313. ' -------------------------------------------------------------
  314. '
  315. ' ************************************************************ 
  316. '                          PLACE BLOCK 
  317. '
  318. ' Puts The Current, Chosen Block Into The Maze Work Area at
  319. ' The Place Specified By The Mouse Pointer 
  320. ' ************************************************************ 
  321. PLACE_BLOCK:
  322. ' ***********************************************************
  323. ' Only Do If The Block Being Placed Is Different To The Block
  324. ' Already There
  325. ' ***********************************************************
  326. MAZE_POINTER=Start(10)+(MAZE_NUMBER*260)+(MOUSE_Y*20)+MOUSE_X
  327. If Peek(MAZE_POINTER)<>BLOCK_NUMBER
  328.    '
  329.    ' ****************** 
  330.    ' Update Undo Buffer 
  331.    ' ****************** 
  332.    X=MOUSE_X : Y=MOUSE_Y : Z=MAZE_POINTER
  333.    Gosub _UPDATE_UNDO_BUFFER
  334.    '
  335.    ' *********************
  336.    ' Put Block Onto Screen
  337.    ' *********************
  338.    Cls 0,MOUSE_X*16,MOUSE_Y*16 To(MOUSE_X*16)+16,(MOUSE_Y*16)+16
  339.    Paste Bob MOUSE_X*16,MOUSE_Y*16,BLOCK_NUMBER
  340.    '
  341.    ' ********************************** 
  342.    ' Replace Grid Section If Grid Is On 
  343.    ' ********************************** 
  344.    If GRID=1
  345.       Ink 1
  346.       Box MOUSE_X*16,MOUSE_Y*16 To(MOUSE_X*16)+15,(MOUSE_Y*16)+15
  347.    End If 
  348.    '
  349.    ' *****************
  350.    ' Update Map Buffer
  351.    ' *****************
  352.    MAZE_POINTER=Start(10)+(MAZE_NUMBER*260)+(MOUSE_Y*20)+MOUSE_X
  353.    Poke MAZE_POINTER,BLOCK_NUMBER
  354.    '
  355. End If 
  356. Return 
  357. '
  358. ' -------------------------------------------------------------
  359. '
  360. ' *************************************************************
  361. '                           SHOW MAZE
  362. '
  363. ' Draws The Current Maze To The Maze Work Area 
  364. ' *************************************************************
  365. _SHOW_MAZE:
  366. MAZE_POINTER=Start(10)+MAZE_NUMBER*260
  367. ' ****************************** 
  368. ' Clear The Maze Work Area First 
  369. ' ****************************** 
  370. Cls 0,0,0 To 320,208
  371. '
  372. ' ****************** 
  373. ' Draw In The Blocks 
  374. ' ****************** 
  375. For Y=0 To 12
  376.    For X=0 To 19
  377.       BLOCK=Peek(MAZE_POINTER)
  378.       If BLOCK>0
  379.          Paste Bob X*16,Y*16,BLOCK
  380.       End If 
  381.       Add MAZE_POINTER,1
  382.    Next X
  383. Next Y
  384. '
  385. ' ***************
  386. ' Draw Grid If On
  387. ' ***************
  388. Gosub _DRAW_GRID
  389. '
  390. Return 
  391. '
  392. ' -------------------------------------------------------------
  393. '
  394. ' *************************************************************  
  395. '                              LOAD  
  396. '
  397. ' Loads The Maze Data From Disk
  398. ' *************************************************************  
  399. _LOAD:
  400. If Mouse Zone=3 and LMB=1
  401.    ' **************** 
  402.    ' Highlight Button 
  403.    ' **************** 
  404.    X0=64 : Y0=224 : X1=111 : Y1=239
  405.    Gosub HIGHLIGHT_BUTTON
  406.    '
  407.    ' ******************** 
  408.    ' Get Data And Show It 
  409.    ' ******************** 
  410.    Load "me_disk:map_data.abk"
  411.    Gosub _SHOW_MAZE
  412.    '
  413.    UNDO_POINTER=0
  414.    LMB=0
  415.    '
  416.    Wait _WAIT_DELAY
  417.    '
  418.    ' ****************** 
  419.    ' Unhighlight Button 
  420.    ' ****************** 
  421.    X0=64 : Y0=224 : X1=111 : Y1=239
  422.    Gosub UNHIGHLIGHT_BUTTON
  423. End If 
  424. Return 
  425. '
  426. ' -------------------------------------------------------------
  427. '
  428. ' *************************************************************  
  429. '                               SAVE 
  430. '
  431. ' Saves The Maze Data To Disk
  432. ' *************************************************************  
  433. _SAVE:
  434. If Mouse Zone=4 and LMB=1
  435.    ' **************** 
  436.    ' Highlight Button 
  437.    ' **************** 
  438.    X0=64 : Y0=240 : X1=111 : Y1=255
  439.    Gosub HIGHLIGHT_BUTTON
  440.    '
  441.    Save "me_disk:map_data.abk",10
  442.    '
  443.    LMB=0
  444.    '
  445.    Wait _WAIT_DELAY
  446.    '
  447.    ' ****************** 
  448.    ' Unhighlight Button 
  449.    ' ****************** 
  450.    X0=64 : Y0=240 : X1=111 : Y1=255
  451.    Gosub UNHIGHLIGHT_BUTTON
  452. End If 
  453. Return 
  454. '
  455. ' -------------------------------------------------------------
  456. '
  457. ' *************************************************************  
  458. '                       CHANGE BLOCK 
  459. '
  460. ' Changes The Current, Chosen Block To Either The Previous Or
  461. ' Next Value 
  462. ' *************************************************************  
  463. CHANGE_BLOCK:
  464. ' ********** 
  465. ' Next Block 
  466. ' ********** 
  467. If Mouse Zone=9 and BLOCK_NUMBER<LAST_BLOCK and LMB=1
  468.    ' **************** 
  469.    ' Highlight Button 
  470.    ' **************** 
  471.    X0=243 : Y0=230 : X1=252 : Y1=239
  472.    Gosub HIGHLIGHT_BUTTON
  473.    '
  474.    ' ******************************** 
  475.    ' Get Next Block And Show On Panel 
  476.    ' ******************************** 
  477.    Add BLOCK_NUMBER,1
  478.    Gosub _SHOW_BLOCK
  479.    '
  480.    LMB=0
  481.    '
  482.    Wait _WAIT_DELAY
  483.    '
  484.    ' ****************** 
  485.    ' Unhighlight Button 
  486.    ' ****************** 
  487.    X0=243 : Y0=230 : X1=252 : Y1=239
  488.    Gosub UNHIGHLIGHT_BUTTON
  489. End If 
  490. '
  491. ' ************** 
  492. ' Previous Block 
  493. ' ************** 
  494. If Mouse Zone=10 and BLOCK_NUMBER>1 and LMB=1
  495.    ' **************** 
  496.    ' Highlight Button 
  497.    ' **************** 
  498.    X0=243 : Y0=240 : X1=252 : Y1=249
  499.    Gosub HIGHLIGHT_BUTTON
  500.    '
  501.    ' ****************************** 
  502.    ' Get Previous Block And Show It 
  503.    ' ****************************** 
  504.    Add BLOCK_NUMBER,-1
  505.    Gosub _SHOW_BLOCK
  506.    '
  507.    LMB=0
  508.    '
  509.    Wait _WAIT_DELAY
  510.    '
  511.    ' ****************** 
  512.    ' Unhighlight Button 
  513.    ' ****************** 
  514.    X0=243 : Y0=240 : X1=252 : Y1=249
  515.    Gosub UNHIGHLIGHT_BUTTON
  516. End If 
  517. Return 
  518. '
  519. ' -------------------------------------------------------------
  520. '
  521. ' *************************************************************
  522. '                            CLEAR 
  523. '
  524. ' Clears The Current, Visible Maze 
  525. ' *************************************************************
  526. CLEAR:
  527. If Mouse Zone=11 and LMB=1
  528.    ' **************** 
  529.    ' Highlight Button 
  530.    ' **************** 
  531.    X0=256 : Y0=224 : X1=287 : Y1=239
  532.    Gosub HIGHLIGHT_BUTTON
  533.    '
  534.    ' **************************************************** 
  535.    ' Get Start Of This Maze's Data And Reset Undo Pointer 
  536.    ' **************************************************** 
  537.    MAZE_POINTER=Start(10)+MAZE_NUMBER*260
  538.    UNDO_POINTER=0
  539.    '
  540.    ' ************************************************************ 
  541.    ' For Each Block, Update Undo Buffer And Then Delete The Block   
  542.    ' ************************************************************   
  543.    For Y=0 To 12
  544.       For X=0 To 19
  545.          Z=MAZE_POINTER
  546.          Gosub _UPDATE_UNDO_BUFFER
  547.          '
  548.          Poke MAZE_POINTER,0
  549.          Add MAZE_POINTER,1
  550.       Next X
  551.    Next Y
  552.    '
  553.    ' ****************************************** 
  554.    ' Show The Maze Once It Has All Been Cleared 
  555.    ' ****************************************** 
  556.    Gosub _SHOW_MAZE
  557.    '
  558.    LMB=0
  559.    '
  560.    Wait _WAIT_DELAY
  561.    '
  562.    ' ****************** 
  563.    ' Unhighlight Button 
  564.    ' ****************** 
  565.    X0=256 : Y0=224 : X1=287 : Y1=239
  566.    Gosub UNHIGHLIGHT_BUTTON
  567. End If 
  568. Return 
  569. '
  570. ' -------------------------------------------------------------
  571. '
  572. ' *************************************************************  
  573. '                            UNDO LAST 
  574. '
  575. ' Will Undo The Last Block Placing Operation 
  576. ' *************************************************************  
  577. UNDO_LAST:
  578. If Mouse Zone=7 and UNDO_POINTER>0 and LMB=1
  579.    ' **************** 
  580.    ' Highlight Button 
  581.    ' **************** 
  582.    X0=144 : Y0=224 : X1=191 : Y1=239
  583.    Gosub HIGHLIGHT_BUTTON
  584.    '
  585.    ' *********************
  586.    ' Set Up Undo And Do It
  587.    ' *********************
  588.    UNDO_COUNTER=1
  589.    Gosub _DO_UNDO
  590.    '
  591.    LMB=0
  592.    '
  593.    Wait _WAIT_DELAY
  594.    '
  595.    ' ****************** 
  596.    ' Unhighlight Button 
  597.    ' ****************** 
  598.    X0=144 : Y0=224 : X1=191 : Y1=239
  599.    Gosub UNHIGHLIGHT_BUTTON
  600. End If 
  601. Return 
  602. '
  603. ' -------------------------------------------------------------
  604. '
  605. ' *************************************************************
  606. '                           UNDO ALL 
  607. '
  608. ' Will Undo All Block Placing Operations Back To The Start Of  
  609. ' The Undo Buffer
  610. ' *************************************************************
  611. UNDO_ALL:
  612. If Mouse Zone=8 and UNDO_POINTER>0 and LMB=1
  613.    ' **************** 
  614.    ' Highlight Button 
  615.    ' **************** 
  616.    X0=144 : Y0=240 : X1=191 : Y1=255
  617.    Gosub HIGHLIGHT_BUTTON
  618.    '
  619.    ' *********************
  620.    ' Set Up Undo And Do It
  621.    ' *********************
  622.    UNDO_COUNTER=UNDO_POINTER
  623.    Gosub _DO_UNDO
  624.    '
  625.    LMB=0
  626.    '
  627.    Wait _WAIT_DELAY
  628.    '
  629.    ' ****************** 
  630.    ' Unhighlight Button 
  631.    ' ****************** 
  632.    X0=144 : Y0=240 : X1=191 : Y1=255
  633.    Gosub UNHIGHLIGHT_BUTTON
  634. End If 
  635. Return 
  636. '
  637. ' -------------------------------------------------------------
  638. '
  639. ' *************************************************************
  640. '                            DO UNDO 
  641. '
  642. ' Performs The Undo Operation(s) Specified By Either UNDO LAST 
  643. ' Or UNDO ALL
  644. ' *************************************************************
  645. _DO_UNDO:
  646. Repeat 
  647.    ' ***************************
  648.    ' Get Values From Undo Buffer
  649.    ' ***************************
  650.    Add UNDO_POINTER,-1
  651.    X=Peek(UNDO_BASE+(UNDO_POINTER*3))
  652.    Y=Peek(UNDO_BASE+(UNDO_POINTER*3)+1)
  653.    I=Peek(UNDO_BASE+(UNDO_POINTER*3)+2)
  654.    '
  655.    ' *********************************
  656.    ' Change Map Buffer To These Values
  657.    ' *********************************
  658.    MAZE_POINTER=Start(10)+MAZE_NUMBER*260
  659.    Poke MAZE_POINTER+(Y*20)+X,I
  660.    '
  661.    ' *********************
  662.    ' Show Change On Screen
  663.    ' *********************
  664.    Cls 0,X*16,Y*16 To(X*16)+16,(Y*16)+16
  665.    If I>0
  666.       Paste Bob X*16,Y*16,I
  667.    End If 
  668.    '
  669.    ' ********************************** 
  670.    ' Replace Grid Section If Grid Is On 
  671.    ' ********************************** 
  672.    If GRID=1
  673.       Ink 1
  674.       Box X*16,Y*16 To(X*16)+15,(Y*16)+15
  675.    End If 
  676.    '
  677.    Add UNDO_COUNTER,-1
  678. Until UNDO_COUNTER=0
  679. Return 
  680. '
  681. ' -------------------------------------------------------------
  682. '
  683. ' *************************************************************
  684. '                             BYE! 
  685. '
  686. ' Quits The Mapper And Returns To The AMOS Editor
  687. ' *************************************************************
  688. BYE:
  689. If Mouse Zone=14 and LMB=1
  690.    ' **************** 
  691.    ' Highlight Button 
  692.    ' **************** 
  693.    X0=288 : Y0=240 : X1=319 : Y1=255
  694.    Gosub HIGHLIGHT_BUTTON
  695.    '
  696.    LMB=0
  697.    '
  698.    Wait _WAIT_DELAY
  699.    '
  700.    ' ****************** 
  701.    ' Unhighlight Button 
  702.    ' ****************** 
  703.    X0=288 : Y0=240 : X1=319 : Y1=255
  704.    Gosub UNHIGHLIGHT_BUTTON
  705.    '
  706.    ' **************** 
  707.    ' Return To Editor 
  708.    ' **************** 
  709.    Edit 
  710. End If 
  711. Return 
  712. '
  713. ' -------------------------------------------------------------
  714. '
  715. ' *************************************************************  
  716. '                       RE-SORT UNDO BUFFER  
  717. '
  718. ' When The Undo Buffer Is Full, The First Entry Is Removed And 
  719. ' All Other Entries Are Moved Down To Make Space For The Next
  720. ' Entry.  Works On The First In, First Out Principal 
  721. ' *************************************************************  
  722. RESORT_UNDO_BUFFER:
  723. ' *******
  724. ' Kerpow!
  725. ' *******
  726. For K=0 To 259
  727.    Poke UNDO_BASE+(K*3),Peek(UNDO_BASE+(K*3)+3)
  728.    Poke UNDO_BASE+(K*3)+1,Peek(UNDO_BASE+(K*3)+4)
  729.    Poke UNDO_BASE+(K*3)+2,Peek(UNDO_BASE+(K*3)+5)
  730. Next K
  731. Return 
  732. '
  733. ' -------------------------------------------------------------
  734. '
  735. ' *************************************************************
  736. '                           DRAW GRID
  737. '
  738. ' Draws A Grid Onto The Maze Work Area 
  739. ' *************************************************************
  740. _DRAW_GRID:
  741. If GRID=1
  742.    Ink 1
  743.    For Y=0 To 12
  744.       For X=0 To 19
  745.          Box X*16,Y*16 To(X*16)+15,(Y*16)+15
  746.       Next X
  747.    Next Y
  748. End If 
  749. Return 
  750. '
  751. ' -------------------------------------------------------------
  752. '
  753. ' *************************************************************
  754. '                          TOGGLE GRID 
  755. '
  756. ' Turns The Grid On Or Off 
  757. ' *************************************************************
  758. _TOGGLE_GRID:
  759. If Mouse Zone=12 and LMB=1
  760.    ' **************** 
  761.    ' Highlight Button 
  762.    ' **************** 
  763.    X0=256 : Y0=240 : X1=287 : Y1=255
  764.    Gosub HIGHLIGHT_BUTTON
  765.    '
  766.    ' ****************** 
  767.    ' Toggle Grid On/Off   
  768.    ' ****************** 
  769.    GRID=1-GRID
  770.    Gosub _SHOW_MAZE
  771.    '
  772.    LMB=0
  773.    '
  774.    Wait _WAIT_DELAY
  775.    '
  776.    ' ****************** 
  777.    ' Unhighlight Button 
  778.    ' ****************** 
  779.    X0=256 : Y0=240 : X1=287 : Y1=255
  780.    Gosub UNHIGHLIGHT_BUTTON
  781. End If 
  782. Return 
  783. '
  784. ' -------------------------------------------------------------
  785. '
  786. ' ************************************************************ 
  787. '                          DELETE BLOCK  
  788. '
  789. ' Deletes The Block Underneath The Mouse Pointer 
  790. ' ************************************************************ 
  791. DELETE_BLOCK:
  792. ' *******************************************
  793. ' Only Do If There Is A Block There To Delete  
  794. ' *******************************************
  795. MAZE_POINTER=Start(10)+(MAZE_NUMBER*260)+(MOUSE_Y*20)+MOUSE_X
  796. If Peek(MAZE_POINTER)<>0
  797.    '
  798.    ' ****************** 
  799.    ' Update Undo Buffer 
  800.    ' ****************** 
  801.    X=MOUSE_X : Y=MOUSE_Y : Z=MAZE_POINTER
  802.    Gosub _UPDATE_UNDO_BUFFER
  803.    '
  804.    ' ************ 
  805.    ' Delete Block 
  806.    ' ************ 
  807.    Cls 0,MOUSE_X*16,MOUSE_Y*16 To(MOUSE_X*16)+16,(MOUSE_Y*16)+16
  808.    '
  809.    ' ********************************** 
  810.    ' Replace Grid Section If Grid Is On 
  811.    ' ********************************** 
  812.    If GRID=1
  813.       Ink 1
  814.       Box MOUSE_X*16,MOUSE_Y*16 To(MOUSE_X*16)+15,(MOUSE_Y*16)+15
  815.    End If 
  816.    '
  817.    ' *****************
  818.    ' Update Map Buffer
  819.    ' *****************
  820.    MAZE_POINTER=Start(10)+(MAZE_NUMBER*260)+(MOUSE_Y*20)+MOUSE_X
  821.    Poke MAZE_POINTER,0
  822.    '
  823. End If 
  824. Return 
  825. '
  826. ' -------------------------------------------------------------
  827. '
  828. ' *************************************************************
  829. '                         UPDATE UNDO BUFFER 
  830. '
  831. ' Before A Block Is Placed Into A Maze, The Block Already There
  832. ' Is Stored In The Undo Buffer So It Can Be Restored If Needed 
  833. ' *************************************************************
  834. _UPDATE_UNDO_BUFFER:
  835. K=UNDO_BASE+(UNDO_POINTER*3)
  836. ' ******************** 
  837. ' Some Jiggery Pokery! 
  838. ' ******************** 
  839. Poke K,X
  840. Poke(K+1),Y
  841. Poke(K+2),Peek(Z)
  842. Add UNDO_POINTER,1
  843. '
  844. If UNDO_POINTER=261
  845.    ' *****************************************  
  846.    ' Have To Re-sort Undo Buffer Coz It's Full  
  847.    ' *****************************************  
  848.    Gosub RESORT_UNDO_BUFFER
  849.    UNDO_POINTER=260
  850. End If 
  851. Return 
  852. '
  853. ' -------------------------------------------------------------
  854. '
  855. ' *************************************************************
  856. '                              COPY  
  857. '
  858. '     Puts A Copy Of The Current Maze Into The Copy Buffer 
  859. ' *************************************************************
  860. _COPY:
  861. If Mouse Zone=5 and LMB=1
  862.    ' **************** 
  863.    ' Highlight Button 
  864.    ' **************** 
  865.    X0=112 : Y0=224 : X1=143 : Y1=239
  866.    Gosub HIGHLIGHT_BUTTON
  867.    '
  868.    ' *******************************************************
  869.    ' Get To Start Of This Maze's Data And Reset Copy Pointer
  870.    ' *******************************************************
  871.    MAZE_POINTER=Start(10)+(MAZE_NUMBER*260)
  872.    _COPY_POINTER=0
  873.    '
  874.    ' *****************************
  875.    ' Copy Maze Data To Copy Buffer
  876.    ' *****************************
  877.    For Y=0 To 12
  878.       For X=0 To 19
  879.          Poke _COPY_BASE+_COPY_POINTER,Peek(MAZE_POINTER)
  880.          Add MAZE_POINTER,1
  881.          Add _COPY_POINTER,1
  882.       Next X
  883.    Next Y
  884.    '
  885.    LMB=0
  886.    '
  887.    Wait _WAIT_DELAY
  888.    '
  889.    ' ****************** 
  890.    ' Unhighlight Button 
  891.    ' ****************** 
  892.    X0=112 : Y0=224 : X1=143 : Y1=239
  893.    Gosub UNHIGHLIGHT_BUTTON
  894. End If 
  895. Return 
  896. '
  897. ' -------------------------------------------------------------
  898. '
  899. ' *************************************************************
  900. '                                PASTE 
  901. '
  902. ' Changes The Current Maze To The Contents Of The Copy Buffer
  903. ' *************************************************************
  904. '
  905. PASTE:
  906. If Mouse Zone=6
  907.    ' **************** 
  908.    ' Highlight Button 
  909.    ' **************** 
  910.    X0=112 : Y0=240 : X1=143 : Y1=255
  911.    Gosub HIGHLIGHT_BUTTON
  912.    '
  913.    ' ***********************************
  914.    ' Get To Start Of Maze Data
  915.    ' Reset Undo Pointer And Copy Pointer
  916.    ' ***********************************
  917.    MAZE_POINTER=Start(10)+(MAZE_NUMBER*260)
  918.    UNDO_POINTER=0
  919.    _COPY_POINTER=0
  920.    '
  921.    ' ***********************************************  
  922.    ' Put What Is Already In Maze Into Undo Buffer 
  923.    ' Then Copy Data From Copy Buffer To Current Maze  
  924.    ' ***********************************************  
  925.    For Y=0 To 12
  926.       For X=0 To 19
  927.          Z=MAZE_POINTER
  928.          Gosub _UPDATE_UNDO_BUFFER
  929.          '
  930.          Poke MAZE_POINTER,Peek(_COPY_BASE+_COPY_POINTER)
  931.          '
  932.          Add MAZE_POINTER,1
  933.          Add _COPY_POINTER,1
  934.       Next X
  935.    Next Y
  936.    '
  937.    ' ***********
  938.    ' Show Result
  939.    ' ***********
  940.    Gosub _SHOW_MAZE
  941.    '
  942.    LMB=0
  943.    '
  944.    Wait _WAIT_DELAY
  945.    '
  946.    ' ****************** 
  947.    ' Unhighlight Button 
  948.    ' ****************** 
  949.    X0=112 : Y0=240 : X1=143 : Y1=255
  950.    Gosub UNHIGHLIGHT_BUTTON
  951. End If 
  952. Return 
  953. '
  954. ' -------------------------------------------------------------
  955. '